import type {
  InternalAxiosRequestConfig,
  AxiosResponse,
  AxiosError,
} from "axios";
import { resolveResError } from "./helpers";
import { token } from "@/utils";
import { useUserStore } from "@/store";

export const reqResolve = (config: InternalAxiosRequestConfig) => {
  config.headers.token = token.get();
  return config;
};

export const reqReject = (error: AxiosError) => {
  // 请求错误，这里可以用全局提示框进行提示
  window.$message.error("请求出错");
  return Promise.reject(error);
};

const reLoginCode = [2, 201, 202, 204, 206];

export const resResolve = (response: AxiosResponse) => {
  // 若响应文件流，则直接返回
  if (response.data.constructor == Blob) {
    return Promise.resolve(response);
  }

  if (!response.data) {
    console.log("没有返回值的请求，response：", response);
    return Promise.resolve({ data: null } as AxiosResponse);
  }

  response.data.code = Number(response.data.code);
  const { code, message } = response.data;
  if (code !== 1) window.$message.error(message);
  response.data.status = code === 1 ? true : false;

  if (reLoginCode.includes(code)) {
    useUserStore().reLogin();
  }

  return Promise.resolve(response);
};

export const resReject = (error: AxiosError) => {
  // 这里用来处理http常见错误，进行全局提示
  let message = "";
  if (error.response) {
    // 请求成功发出且服务器也响应了状态码，但状态代码超出了 2xx 的范围
    message = resolveResError(error.response.status);
  } else if (error.request) {
    // 请求已经成功发起，但没有收到响应
    message = "服务器未响应";
  } else {
    // 发送请求时出了点问题
    message = "请求失败";
  }
  // 这里错误消息可以使用全局弹框展示出来
  window.$message.error(message);

  return Promise.reject(error.response);
};
